package com.ruoyi.project.express.api.service.aliyun;

import com.ruoyi.common.exception.BusinessException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.project.express.api.domain.ExpressAPIEnum;
import com.ruoyi.project.express.api.service.IExpressService;
import com.ruoyi.project.express.api.util.AliyunHttpUtils;
import com.ruoyi.project.express.api.domain.ExpressEnum;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Service;

import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;

/**
 * @description: 阿里云服务实现快递接口
 * @author: lindor
 * @date 2020/4/4 16:01
 **/
@Service
public class AliyunExpressServiceImpl implements IExpressService {

    /**
     * API网关地址
     */
    final String API_ROUTER = "https://kuaidid.market.alicloudapi.com";

    final String PATH = "/danhao";

    final String APP_CODE = "3557435b28f24aa4a3e179f5bd8fc27b";

    @Override
    public boolean isSupport(ExpressEnum expressEnum) {
        return ExpressAPIEnum.阿里.equals(expressEnum);
    }

    @Override
    public AjaxResult returnLogisticsInfo(String com, String no, String phone) {

        if (StringUtils.isEmpty(com)) {
            return AjaxResult.error("快递公司编号不能为空");
        }
        if (StringUtils.isEmpty(no)) {
            return AjaxResult.error("快递单号不能为空");
        }

        Map<String, String> headers = new HashMap<String, String>();
        //最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
        headers.put("Authorization", "APPCODE " + APP_CODE);
        //根据API的要求，定义相对应的Content-Type
        headers.put("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
        Map<String, String> querys = new HashMap<String, String>();
        Map<String, String> bodys = new HashMap<String, String>();
        bodys.put("com", com);

        if (ExpressEnum.顺丰.getValue().equals(com)) {
            //顺丰请输入单号 : 收件人或寄件人手机号后四位
            if (StringUtils.isEmpty(phone)) {
                return AjaxResult.error("顺丰快递收件人或寄件人手机号后四位不能为空");
            }
            bodys.put("src", no + ":" + phone);
        }

        bodys.put("src", no);

        try {
            /**
             * 重要提示如下:
             * HttpUtils请从
             * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
             * 下载
             *
             * 相应的依赖请参照
             * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
             * 返回状态state说明：
             * 0：在途，即货物处于运输过程中；
             * 1：揽件，货物已由快递公司揽收并且产生了第一条跟踪信息；
             * 2：疑难，货物寄送过程出了问题；
             * 3：签收，收件人已签收；
             * 4：退签或异常签收，即货物由于用户拒签、超区等原因退回，而且发件人已经签收；
             * 5：派件，即快递正在进行同城派件；
             * 6：退回，货物正处于退回发件人的途中；
             */
            HttpResponse response = AliyunHttpUtils.doPost(API_ROUTER, PATH, "POST", headers, querys, bodys);
//            System.out.println(response.toString());
            //获取response的body
//            System.out.println(EntityUtils.toString(response.getEntity()));

            return AjaxResult.success(EntityUtils.toString(response.getEntity(), Charset.forName("UTF-8")));
        } catch (Exception e) {
            e.printStackTrace();
            throw new BusinessException(e.getMessage());
        }
    }


    @Override
    public AjaxResult subscribeLogisticsInfo() {
        return null;
    }
}
